package com.wbs.config;

import com.wbs.realm.UserRealm;
import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.filter.mgt.DefaultFilter;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.LinkedHashMap;

//shiro配置 开发流程 1.Redlm. 2.SecurityManager. 3.ShiroFilterFctoryBean
@Configuration
public class ShiroConfig {
    //实例化redlm
    @Bean
    public UserRealm userRealm(){
        UserRealm userRealm = new UserRealm();
        userRealm.setCredentialsMatcher(hashedCredentialsMatcher());
        return userRealm;
    }

    //绑定安全管理器   实例化manage对象   它是一个接口, 这里实例化的是他的实现类
    @Bean
    public DefaultWebSecurityManager defaultWebSecurityManager(){
        DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
        //将redlm 给它
        defaultWebSecurityManager.setRealm(userRealm());
        return defaultWebSecurityManager;
    }

    //实例化过滤器对象  2件事 1.设置安全管理器. 2.配置过滤规则
    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(){
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        //设置安全管理器   将manage对象给它
        shiroFilterFactoryBean.setSecurityManager(defaultWebSecurityManager());

        //配置过滤规则   设置拦截路径
        //ShiroFilterFactoryBean类的参数在DefaultFilter中存储, 这样写高级 呵呵
        LinkedHashMap<String,String> linkedHashMap = new LinkedHashMap<>();

        //放行登陆请求        DefaultFilter.anon.name()这里用的是hutoolAPI给我们提供的方法
        linkedHashMap.put("/loginController/**", DefaultFilter.anon.name());

        //放行静态资源
        linkedHashMap.put("/js/**",DefaultFilter.anon.name());

        //拦截其余所有    其余都需要登陆
        linkedHashMap.put("/**",DefaultFilter.authc.name());

        //将配置的规则设置进去
        shiroFilterFactoryBean.setFilterChainDefinitionMap(linkedHashMap);

        //配置跳转的登录页面
//        shiroFilterFactoryBean.setLoginUrl("/loginController/jumpToLogin");

        //登录失败跳转路径
//        shiroFilterFactoryBean.setLoginUrl("");
        //没有权限跳转路径
//        shiroFilterFactoryBean.setUnauthorizedUrl("");
        return shiroFilterFactoryBean;
    }

    //配置解密方式        然后把它交给 上面的实例化redlm
    @Bean
    public HashedCredentialsMatcher hashedCredentialsMatcher(){
        HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();
        //告诉Shiro我们使用什么加密的
        hashedCredentialsMatcher.setHashAlgorithmName("md5");//我们使用的加密方式
        //我们的加密次数
        hashedCredentialsMatcher.setHashIterations(7);//加密次数
        //开启16进制   因为我们加密的时候使用16进制进行的加密, 这里也要用16进制进行解密
        hashedCredentialsMatcher.setStoredCredentialsHexEncoded(true);//开启16进制
        return hashedCredentialsMatcher;
    }

    //实例化Dialect 隐藏按钮选项
//    @Bean
//    public ShiroDialect shiroDialect(){
//        return new ShiroDialect();
//    }
}
